//
//  "$Id$"
//
//  Copyright (c)1992-2011, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __INTELLI_TRACK_API_H__
#define __INTELLI_TRACK_API_H__

#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup videoAnalyseAPI API Video Analyser
/// 视频分析接口
///	\n 调用流程图:
/// \code
///    ===========================
///                |
///        *createIntelliTrack
///                |
///             addRef
///                |
///           setTrackRule
///                |
///             release
///                |
///    ===========================
/// \endcode
/// @{


/// 边界类型
typedef enum IntelliTrackLimitDirection
{
	intelliTrackTop,		///< 上边界限位
	intelliTrackBottom,	///< 下边界限位
	intelliTrackLeft,		///< 左边界限位
	intelliTrackRight		///< 右边界限位
} IntelliTrackLimitDirection;

/// 跟踪场景参数, 128字节
typedef struct IntelliTrackSceneConfig
{
	float 	minZoom;		///< 最小变倍, 归一化到0~1
	float 	maxZoom;		///< 最大变倍, 归一化到0~1
	int		duration;		///< 跟踪时间长度，跟踪时长，以秒为单位
	char	type;			///< 跟踪模式，0-自动，1-手动
	int		reserved[28];	///< 保留
} IntelliTrackSceneConfig;


/// 跟踪物体信息, 128字节
typedef struct IntelliTrackObject
{
	int 		id;				///< id -1 表示web上框选的是智能帧上传框外任意位置物体，>=0表示框选的是智能帧上传的物体
	Rect		boundingBox;	///< 包围盒, 矩形类型，点的坐标归一化到[0,8191]区间
	int			reserved[27];	///< 保留
} IntelliTrackObject;


/// 跟踪状态信息, 128字节
typedef struct IntelliTrackState
{
	char	state;			///< 球机当前状态:0 空闲，-1 异常，1 跟踪中，2跟踪结束
	int		reserved[31];	///< 保留
} IntelliTrackState;


/// 智能球机接口，128个指针
typedef struct IntelliTracker
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct IntelliTracker *thiz);


	/// 释放接口
	int (*release)(struct IntelliTracker *thiz);


	/// 开启跟踪算法
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*start)(struct IntelliTracker *thiz);


	/// 停止跟踪算法
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*stop)(struct IntelliTracker *thiz);


	/// 设置跟踪算法
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] config 跟踪场景参数
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setTrackSceneConfig)(struct IntelliTracker *thiz, IntelliTrackSceneConfig* config);


	/// 标定场景
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] preset 场景ID
	/// \retval 0  成功
	/// \retval <0  失败
	int (*markScene)(struct IntelliTracker *thiz, int preset);


	/// 转动到场景
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] preset 场景ID
	/// \retval 0  成功
	/// \retval <0  失败
	int (*gotoScene)(struct IntelliTracker *thiz, int preset);


	/// 开启/关闭球机限位
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] preset 场景ID
	/// \param [in] enable 0 限位关闭，1限位开启
	/// \retval 0  成功
	/// \retval <0  失败
	int (*enableSceneLimit)(struct IntelliTracker *thiz, int preset, int enable);


	/// 标定场景限位参数
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] preset 场景ID
	/// \param [in] dir 边界方向类型
	/// \retval 0  成功
	/// \retval <0  失败
	int (*markSceneLimit)(struct IntelliTracker *thiz, int preset, IntelliTrackLimitDirection dir);


	/// 转动到场景边界限位处
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] preset 场景ID
	/// \param [in] dir 边界方向类型
	/// \retval 0  成功
	/// \retval <0  失败
	int (*gotoSceneLimit)(struct IntelliTracker *thiz, int preset, IntelliTrackLimitDirection dir);


	/// 标定场景最大跟踪倍率
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] preset 场景ID
	/// \retval 0  成功
	/// \retval <0  失败
	int (*markSceneMaxZoom)(struct IntelliTracker *thiz, int preset);


	/// 选中场景中的跟踪目标
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [in] obj  要跟踪的物体信息
	/// \retval 0  成功
	/// \retval <0  失败
	int (*trackObject)(struct IntelliTracker *thiz, IntelliTrackObject *obj);


	/// 获取跟踪状态
	/// 
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [out] state  跟踪状态指针
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getState)(struct IntelliTracker *thiz, IntelliTrackState *state);


	/// 取版本信息
	///
	/// \param [in] thiz 智能跟踪接口指针
	/// \param [out] version 存放版本信息的指针
	/// \retval 0  成功
	/// \retval <0  失败
	int (*getVersion)(struct IntelliTracker *thiz, struct Version* version);


	///< 保留
	void* reserved[113];

} IntelliTracker;


/// 智能跟踪接口指针描述，128字节
typedef struct IntelliTrackerDesc
{
	int	channel;			///< 视频跟踪通道号
	int	reserved[31];		///< 保留
} IntelliTrackerDesc;


/// 创建视频分析接口
///
/// \param [in] desc 智能球机接口指针描述结构 IntelliTrackDesc 指针
/// \param [out] intelliTracker 智能球机接指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createIntelliTracker(IntelliTrackerDesc *desc, IntelliTracker **intelliTracker);


/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__INTELLI_TRACK_API_H__

